MySQL オプティマイザ
#MySQL #DB
概要
MySQLに関わらず、DBMSには必ず搭載されてると言っても過言ではない「オプティマイザ」。
一般的にこいつが何をしてるのかを解き明かしつつ、MySQLにおけるオプティマイザの取り扱い方を調べていこうと思う。
なんとなく概要掴んだら、公式ドキュメントをしっかり読み込もうぜ。
オプティマイザとは?
SQLを元にデータストア(MySQLだとストレージエンジン)に対する具体的な処理内容(= 実行計画)を生成する機能。
DBMSによって独自に実装されてるが、基本的な考え方は一緒。
ユーザーから受け取ったSQLから複数の実行案を算出し、その中で最も効率の良い案を採用して実行計画を生成する。
オプティマイザの考え方はこれだけ。
一般的な詳細処理は?
オプティマイザが実行計画を出すためにいくつかの情報を利用している。
1. SQL文
言わずもがな。SQL文の内容によって、実行計画は変わる。
2. 統計情報
データベースやテーブルの統計情報(メタデータ)を参考に実行計画を立ててる。
MySQLでのオプティマイザの制御方法
基本的にオプティマイザを無茶に弄らず、思うがままにやらせておけばいい。
ただ、オプティマイザにも間違い(非効率な実行計画を選んでしまうこと)はある。
その場合は、利用者側でしっかり制御してあげる必要がある。
MySQLでは主に3つの制御方法がある。
1. optimizer_switchシステム変数
2. インデックスヒント
3. オプティマイザヒント
参考
DBのオプティマイザまとめ - Qiita
Oracle® MySQLのヒントについて - Qiita
MySQL :: MySQL 8.0 リファレンスマニュアル :: 8.9 クエリーオプティマイザの制御